home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / games / spritegrabber / grabber / iff.s < prev    next >
Text File  |  1980-01-03  |  11KB  |  555 lines

  1. init_editor_screen
  2.     move.l    editscreenB,a0
  3.     move.l    editscreenA,a1
  4.     move.l    #((40*200)*8)-1,d7
  5. .loop    clr.b    (a0)+
  6.     clr.b    (a1)+
  7.     dbra    d7,.loop
  8.     move.l    #0,iff_screen_size
  9.     move.l    #0,iff_masksize
  10.     move.l    #0,iff_maskscreen
  11.     move.l    #0,iff_screen
  12.     rts
  13. ;---------------------------------------------
  14. set_iff_screen
  15.     cmp.l    #0,iff_screen
  16.     bne.s    .iff
  17.     move.l    #0,screenXpos
  18.     move.l    #0,screenYpos
  19.     move.l    #40*8,iff_nextline
  20.     move.l    #320,iff_width_pixels
  21.     move.l    #40,iff_width    
  22.     move.l    #8,iff_depth
  23.     move.l    #200,iff_height
  24.     move.l    editscreenB,a0
  25.     bsr    create_dum_iff_table
  26.     move.l    editscreenB,d0
  27.     bra    set_dum_iff
  28.  
  29. .iff    move.l    iff_Screen,d0
  30.     add.l    screenXpos,d0
  31.     move.l    iff_nextline,d3
  32.     mulu.l    screenYpos,d3
  33.     add.l    d3,d0
  34. set_dum_iff
  35.     move.l    iff_width,d1
  36.     move.l    d1,d2
  37.     moveq.l    #8-1,d7
  38.     lea    grab_planes,a0
  39. .loop    move.w    d0,6(a0)
  40.     swap    d0
  41.     move.w    d0,2(a0)
  42.     swap    d0
  43.     add.l    d1,d0
  44.     addq.l    #8,a0
  45.     dbra    d7,.loop
  46.  
  47.     move.l    iff_depth,d1
  48.     add.l    iff_stencil,d1
  49.     cmp.l    #8,d1
  50.     bge.s    .a1
  51.     addq.l    #1,d1
  52. .a1    mulu    d1,d2
  53.     sub.w    #40,d2
  54.     move.w    d2,grab_modulo+2
  55.     move.w    d2,grab_modulo+6
  56.  
  57.     move.l    iff_depth,d1
  58.     cmp.l    #8,d1
  59.     beq.s    .a
  60.     add.l    #1,d1
  61. .a    lea    grab_display_table,a0
  62.     move.w    (a0,d1.w*2),grab_display+2
  63.     rts
  64.  
  65. grab_display_table
  66.     dc.w    $0201,$1201,$2201,$3201,$4201,$5201,$6201,$7201,$0211
  67. ;---------------------------------------------
  68. search_txt    cmp.l    (a2),d6
  69.     beq.s    .found_ok
  70.     addq.l    #2,a2
  71.     subq.l    #2,d7
  72.     bpl.s    search_txt
  73.     moveq    #-1,d7
  74.     rts
  75. .found_ok    addq.l    #4,a2
  76.     subq.l    #4,d7
  77.     rts
  78. ;---------------------------------------------
  79. check_iff_lbm_file
  80.     move.l    iff_address,a2
  81.     cmp.l    #'FORM',(a2)
  82.     beq.s    .okayFORM
  83.     move.w    #2,status_mode
  84.     rts
  85. .okayFORM    move.l    #1,iff_flags
  86.     move.l    #'ILBM',d6
  87.     move.l    iff_address,a2
  88.     move.l    iff_length,d7
  89.     bsr    search_txt
  90.     tst.l    d7
  91.     bpl.s    .okayILBM
  92.     move.l    #2,iff_flags
  93.     move.l    #'PBM ',d6
  94.     move.l    iff_address,a2
  95.     move.l    iff_length,d7
  96.     bsr    search_txt
  97.     tst.l    d7
  98.     bpl.s    .okayILBM
  99. ; ERROR NO HEADER
  100.     move.w    #3,status_mode
  101.     rts
  102. ;---------------------------------------------
  103. .okayILBM    move.l    #'BMHD',d6
  104.     move.l    iff_address,a2
  105.     move.l    iff_length,d7
  106.     bsr    search_txt
  107.     tst.l    d7
  108.     bpl.s    .okayBMHD
  109.     move.w    #4,status_mode
  110.     rts
  111. ;---------------------------------------------
  112. .okayBMHD    addq.l    #4,a2
  113.     moveq.l    #0,d0
  114.     move.w    (a2)+,d0
  115.     move.l    d0,iff_width_pixels
  116.     move.w    (a2)+,d0
  117.     move.l    d0,iff_height
  118.     addq.l    #4,a2
  119.     moveq.l    #0,d2
  120.     move.b    (a2),d2
  121.     move.l    d2,iff_depth
  122.     moveq.l    #0,d2
  123.     move.b    1(a2),d2
  124.     cmp.l    #1,d2
  125.     beq.s    .stencil
  126.     moveq.l    #0,d2
  127. .stencil    move.l    d2,iff_stencil
  128.     moveq.l    #0,d2
  129.     move.b    2(a2),d2
  130.     move.l    d2,iff_compression
  131. ;---------------------------------------------
  132.     move.l    #'CMAP',d6
  133.     move.l    iff_address,a2
  134.     move.l    iff_length,d7
  135.     bsr    search_txt
  136.     tst.l    d7
  137.     bpl.s    .okayCMAP
  138.     move.w    #5,status_mode
  139.     rts
  140. ;---------------------------------------------
  141. .okayCMAP    lea    iff_palette,a3
  142.     move.l    #256-1,d7
  143. .loopCMAP2    move.b    #$ff,(a3)+
  144.     move.b    #$ff,(a3)+
  145.     move.b    #$ff,(a3)+
  146.     dbra    d7,.loopCMAP2
  147.         
  148.     move.l    iff_depth,d0
  149.     subq.l    #1,d0
  150.     moveq.l    #0,d7
  151.     move.b    (.iff_colourindex,d0.w),d7
  152.     move.l    d7,iff_colours
  153.     moveq.l    #0,d0
  154.     addq.l    #4,a2
  155.     lea    iff_palette,a3
  156. .CMAPloop    move.b    (a2)+,(a3)+
  157.     move.b    (a2)+,(a3)+
  158.     move.b    (a2)+,(a3)+
  159.     dbra    d7,.CMAPloop
  160.     rts        
  161.  
  162. .iff_colourindex    dc.b    1,3,7,15,31,63,127,255
  163. ;---------------------------------------------
  164. alloc_iff_file
  165.     move.l    iff_screen_size,d0
  166.     move.l    #$10002,d1
  167.     LIB    allocmem,exec
  168.     tst.l    d0
  169.     beq.s    .error
  170.     move.l    d0,iff_screen
  171.     moveq.l    #0,d7
  172.     rts
  173. .error    move.w    #6,status_mode
  174.     moveq.l    #-1,d7
  175.     rts
  176. ;---------------------------------------------
  177. alloc_mask_screen
  178.     move.l    iff_masksize,d0
  179.     move.l    #$10001,d1
  180.     LIB    allocmem,exec
  181.     tst.l    d0
  182.     beq.s    .error2
  183.     move.l    d0,iff_maskscreen
  184.     moveq.l    #0,d7
  185.     rts
  186. .error2    move.w    #9,status_mode
  187.     moveq.l    #-1,d7
  188.     rts
  189. ;---------------------------------------------
  190. free_iff_file
  191.     cmp.l    #0,iff_screen
  192.     beq.s    .out
  193.     move.l    iff_screen,a1
  194.     move.l    iff_screen_size,d0
  195.     LIB    freemem,exec
  196.     move.l    #0,iff_Screen
  197. .out    rts
  198. ;---------------------------------------------
  199. free_mask_screen
  200.     cmp.l    #0,iff_maskscreen
  201.     beq.s    .out2
  202.     move.l    iff_maskscreen,a1
  203.     move.l    iff_masksize,d0
  204.     LIB    freemem,exec
  205.     move.l    #0,iff_maskscreen
  206. .out2    rts
  207. ;---------------------------------------------
  208. get_iff_size
  209.     move.l    iff_width_pixels,d0
  210.     move.l    iff_height,d1
  211.     move.l    iff_depth,d2
  212.     add.l    iff_stencil,d2
  213.     lsr.w    #3,d0
  214.     btst    #0,d0
  215.     beq.s    .a
  216.     add.l    #1,d0
  217. .a    move.l    d0,iff_width
  218.     mulu.l    d1,d0
  219.     mulu.l    d2,d0
  220.     move.l    d0,iff_screen_size
  221.  
  222.     move.l    iff_depth,d0
  223.     add.l    iff_stencil,d0
  224.     cmp.l    #8,d0
  225.     bge.s    .past
  226.     addq.l    #1,d0
  227. .past    move.l    iff_width,d1
  228.     mulu    d0,d1
  229.     move.l    d1,iff_nextline
  230.  
  231.     move.l    iff_height,d1
  232.     move.l    iff_width,d0
  233.     mulu    d0,d1
  234.     move.l    d1,iff_planesize
  235.     move.l    d1,iff_masksize
  236.     rts
  237. ;---------------------------------------------
  238. decode_iff    bsr    alloc_iff_file
  239.     tst.l    d7
  240.     beq.s    .okayALLOC
  241.     rts
  242. .okayALLOC    move.l    #'BODY',d6
  243.     move.l    iff_address,a2
  244.     move.l    iff_length,d7
  245.     bsr    search_txt
  246.     tst.l    d7
  247.     bpl.s    .okayBODY
  248.     move.w    #7,status_mode
  249.     rts
  250. .okayBODY    move.l    iff_screen,a1
  251.     tst.l    iff_compression
  252.     bne.s    .compressed
  253.     bsr    no_compression
  254.     rts
  255. .compressed
  256.     bsr    run_length_decode
  257. .outy    rts
  258. ;---------------------------------------------
  259. checkflags    cmp.l    #1,iff_stencil
  260.     beq    .next
  261.     cmp.l    #8,iff_depth
  262.     beq    .next
  263. ;---------------------------------------------
  264.     move.l    iff_screen_size,d0
  265.     add.l    iff_planesize,d0
  266.     move.l    d0,iff_pulse_size
  267.     move.l    #$10002,d1
  268.     LIB    allocmem,exec
  269.     move.l    d0,iff_pulse_screen
  270. ;---------------------------------------------
  271.     move.l    iff_screen,a0
  272.     move.l    iff_pulse_screen,a1
  273.     move.l    iff_width,d0
  274.     move.l    iff_height,d7
  275.     subq.l    #1,d7
  276. .loop1    move.l    iff_nextline,d1
  277.     sub.l    iff_width,d1
  278.     subq.l    #1,d1
  279. .loop    move.b    (a0)+,(a1)+
  280.     dbra    d1,.loop
  281.     add.l    d0,a1
  282.     dbra    d7,.loop1        
  283. ;---------------------------------------------
  284.     move.l    iff_screen,a1
  285.     move.l    iff_screen_size,d0
  286.     move.l    a1,a0
  287.     move.l    d0,d1
  288.     LIB    freemem,exec
  289. ;---------------------------------------------
  290.     move.l    iff_pulse_screen,iff_screen
  291.     move.l    iff_pulse_size,iff_screen_size
  292.     move.l    #0,iff_pulse_screen
  293. ;---------------------------------------------
  294. .next    cmp.l    #2,iff_flags
  295.     bne.s    .out
  296.     move.l    iff_screen_size,d0
  297.     move.l    #$10002,d1
  298.     LIB    allocmem,exec
  299.     move.l    d0,iff_pc_screen
  300.  
  301.     bsr    convert_chunky
  302.  
  303.     move.l    iff_screen,a1
  304.     move.l    iff_screen_size,d0
  305.     move.l    a1,a0
  306.     move.l    d0,d1
  307.     LIB    freemem,exec
  308.  
  309.     move.l    iff_pc_screen,iff_screen
  310. .out    rts
  311. ;---------------------------------------------
  312. no_compression
  313.     move.l    (a2)+,d0
  314. .cloop    move.b    (a2)+,(a1)+
  315.     subq.l    #1,d0
  316.     bgt.s    .cloop
  317.     rts
  318. ;---------------------------------------------
  319. run_length_decode
  320.     move.l    (a2)+,d0
  321.  
  322. .loop    move.b    (a2)+,d1
  323.     bmi.s    .run
  324. .cloop    move.b    (a2)+,(a1)+
  325.     subq.l    #1,d0
  326.     subq.b    #1,d1
  327.     bge.s    .cloop
  328.     subq.l    #1,d0
  329.     bgt.s    .loop
  330.     rts
  331. .run    move.b    (a2)+,d2
  332. .rloop    move.b    d2,(a1)+
  333.     addq.b    #1,d1
  334.     ble.s    .rloop
  335.     subq.l    #2,d0
  336.     bgt.s    .loop
  337.     rts
  338. ;---------------------------------------------
  339. convert_chunky
  340.     move.l    iff_screen,a0
  341.     move.l    iff_pc_screen,a1
  342.     movem.l    d0-d7/a2-a6,-(sp)
  343.     move.l    #0,d6
  344.     move.l    #0,d7
  345.     move.l    iff_width_pixels,d5
  346.     lsr.w    #3,d5
  347.     lea    (a1,d5.w),a2    
  348.     movea.l    a2,a3        
  349.     lea    (a1,d5.w*2),a4    
  350.     lea    (a4,d5.w*2),a5    
  351.     lea    (a5,d5.w*2),a6    
  352. .mainloop    move.l    (a0)+,d0    
  353.     move.l    (a0)+,d1    
  354.     move.l    d0,d2        
  355.     and.l    #$0f0f0f0f,d2        
  356.     eor.l    d2,d0        
  357.     move.l    d1,d3        
  358.     and.l    #$0f0f0f0f,d3        
  359.     eor.l    d3,d1        
  360.     lsl.l    #4,d2        
  361.     or.l    d3,d2        
  362.     lsr.l    #4,d1        
  363.     or.l    d1,d0        
  364.     move.l    d2,d3        
  365.     and.l    #$3333cccc,d3        
  366.     move.w    d3,d1        
  367.     clr.w    d3        
  368.     lsl.l    #2,d3        
  369.     lsr.w    #2,d1        
  370.     or.w    d1,d3        
  371.     swap    d2        
  372.     and.l    #$3333cccc,d2        
  373.     or.l    d2,d3        
  374.     move.l    d0,d1        
  375.     and.l    #$3333cccc,d1        
  376.     move.w    d1,d2        
  377.     clr.w    d1        
  378.     lsl.l    #2,d1        
  379.     lsr.w    #2,d2        
  380.     or.w    d2,d1        
  381.     swap    d0        
  382.     and.l    #$3333cccc,d0        
  383.     or.l    d0,d1        
  384.     move.l    d1,d2        
  385.     lsr.l    #7,d2        
  386.     move.l    d1,d0        
  387.     and.l    #$55555555,d0        
  388.     eor.l    d0,d1        
  389.     move.l    d2,d4        
  390.     and.l    #$55555555,d4        
  391.     eor.l    d4,d2        
  392.     or.l    d4,d1        
  393.     lsr.l    #1,d1        
  394.     move.b    d1,(a6,d5.w)    
  395.     swap    d1        
  396.     move.b    d1,(a5,d5.w)    
  397.     or.l    d0,d2        
  398.     move.b    d2,(a6)+    
  399.     swap    d2        
  400.     move.b    d2,(a5)+    
  401.     move.l    d3,d2        
  402.     lsr.l    #7,d2        
  403.     move.l    d3,d0        
  404.     and.l    #$55555555,d0        
  405.     eor.l    d0,d3        
  406.     move.l    d2,d4        
  407.     and.l    #$55555555,d4        
  408.     eor.l    d4,d2        
  409.     or.l    d4,d3        
  410.     lsr.l    #1,d3        
  411.     move.b    d3,(a4,d5.w)    
  412.     swap    d3        
  413.     move.b    d3,(a3)+    
  414.     or.l    d0,d2        
  415.     move.b    d2,(a4)+    
  416.     swap    d2        
  417.     move.b    d2,(a1)+    
  418.     add.l    #1,d6
  419.     move.l    iff_width_pixels,d0
  420.     lsr.w    #3,d0
  421.     cmp.l    d6,d0
  422.     bne    .mainloop
  423.     move.l    #8-1,d0    
  424.     move.l    iff_width_pixels,d1
  425.     lsr.w    #3,d1
  426.     mulu.w    d0,d1
  427.     lea.l    (a1,d1.w),a1
  428.     lea.l    (a1,d5.w),a2    
  429.     movea.l    a2,a3        
  430.     lea.l    (a1,d5.w*2),a4    
  431.     lea.l    (a4,d5.w*2),a5    
  432.     lea.l    (a5,d5.w*2),a6
  433.     moveq.l    #0,d6
  434.     addq.l    #1,d7
  435.     move.l    iff_height,d0
  436.     cmp.l    d7,d0            
  437.     bne    .mainloop
  438.     movem.l    (sp)+,d0-d7/a2-a6
  439.     rts
  440. ;---------------------------------------------
  441. do_iff_palette
  442.     lea    iff_palette,a0
  443. do_palette    lea    grab_colours,a2
  444.     lea    grab_colours_lo,a1
  445.     moveq.l    #8-1,d7
  446. .loop    addq.l    #4,a1
  447.     addq.l    #4,a2
  448.     move.l    #32-1,d6
  449. .loop1    bsr    make_colour
  450.     move.w    d0,2(a1)
  451.     swap    d0
  452.     move.w    d0,2(a2)
  453.     addq.l    #4,a1
  454.     addq.l    #4,a2
  455.     dbra    d6,.loop1
  456.     dbra    d7,.loop        
  457.     rts
  458. ;---------------------------------------------
  459. make_colour
  460.     moveq.l    #0,d0
  461.     moveq.l    #0,d1
  462.     moveq.l    #0,d2
  463.     moveq.l    #0,d3
  464.     Move.b    (a0),d1
  465.     Move.b    1(a0),d2
  466.     Move.b    2(a0),d3
  467.     Moveq    #$f,d4
  468.     And.w    d4,d1
  469.     And.w    d4,d2
  470.     And.w    d4,d3
  471.     Lsl.w    #8,d1
  472.     Lsl.w    #4,d2
  473.     Or.w    d1,d2
  474.     Or.w    d2,d3
  475.     Move.w    d3,d0
  476.     Swap    d0
  477.     Move.b    (a0)+,d1
  478.     Move.b    (a0)+,d2
  479.     Move.b    (a0)+,d3
  480.     Lsr.w    #4,d1
  481.     Lsr.w    #4,d2
  482.     Lsr.w    #4,d3
  483.     And.w    d4,d1
  484.     And.w    d4,d2
  485.     And.w    d4,d3
  486.     Lsl.w    #8,d1
  487.     Lsl.w    #4,d2
  488.     Or.w    d1,d2
  489.     Or.w    d2,d3
  490.     Move.w    d3,d0
  491.     Swap    d0
  492.     rts
  493. ;---------------------------------------------
  494. create_iff_table
  495.     move.l    iff_width,d0
  496.     move.l    iff_screen,a0
  497. create_dum_iff_table
  498.     lea    iff_table,a1
  499.     moveq.l    #8-1,d7
  500. .loop    move.l    a0,(a1)+
  501.     add.l    d0,a0
  502.     dbra    d7,.loop
  503.     rts
  504. ;---------------------------------------------
  505. create_mask_screen
  506.     bsr    alloc_mask_screen
  507.  
  508.     tst.l    iff_maskscreen
  509.     beq    .out
  510.     move.l    iff_height,d7
  511.     subq.l    #1,d7
  512.     move.l    iff_maskscreen,a1
  513.     moveq.l    #0,d2        ;offset
  514. ;---------------------------------------------
  515. .loop1    move.l    iff_width,d6
  516.     subq.l    #1,d6
  517.     move.l    d2,d1
  518. .loop2    lea    iff_table,a0
  519. ;---------------------------------------------
  520.     move.l    iff_depth,d5
  521.     subq.w    #1,d5
  522.     moveq.l    #0,d0
  523. .loop3    move.l    (a0)+,a2
  524.     add.l    d1,a2
  525.     or.b    (a2),d0
  526.     dbra    d5,.loop3
  527. ;---------------------------------------------
  528.     move.b    d0,(a1)+
  529.     addq.l    #1,d1
  530.     dbra    d6,.loop2
  531. ;---------------------------------------------
  532.     add.l    iff_nextline,d2
  533.     dbra    d7,.loop1
  534. .out    rts
  535. ;---------------------------------------------
  536. print_screen_size
  537.     move.l    #1,tcol
  538.     move.l    #74,d0
  539.     move.l    #20,d1
  540.     move.l    iff_width_pixels,d2
  541.     moveq.l    #4,d3
  542.     bsr    dec_print
  543.     move.l    #74,d0
  544.     move.l    #28,d1
  545.     move.l    iff_height,d2
  546.     moveq.l    #4,d3
  547.     bsr    dec_print
  548.     move.l    #74,d0
  549.     move.l    #36,d1
  550.     move.l    iff_depth,d2
  551.     moveq.l    #4,d3
  552.     bsr    dec_print
  553.     rts
  554. ;---------------------------------------------
  555.